package com.A3Sleep与Wait的区别;

import java.util.TreeMap;

/**
 * @Auther: SJZ    2907374717@qq.com
 * @Date: 2019/3/12 21:02
 * @Description: notify:t通告，通知
 * 对于sleep()方法，我们首先知道是属于Thread类中的。而wait()方法，则是属于Objectl类中的。
 * sleep()方法导致了程序暂停执行指定时间，让出cpu给其他线程，但是他的监控状态依然保持者，
 * 当指定时间到了又会恢复运行状态。
 * 在调用sleep()方法的过程中，线程不会释放对象锁。
 * 而当调用wait()f方法的时候，线程会放弃对象锁，进入等待对象的等待锁定池，只有针对此对象调用
 * notify()方法后，本线程才进入对象锁定池准备获取对象锁进入运行状态。
 */
public class Test {


    private static class Thread1 implements Runnable {
        @Override
        public void run() {
            synchronized (Test.class) {
                System.out.println("enter thread1......");
                System.out.println("thread1 is waiting.....");
                try {
                    Test.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread1 is going on.....");
                System.out.println("thread1 is over!!!");
            }
        }
    }

    private static class Thread2 implements Runnable {
        @Override
        public void run() {
            synchronized (Test.class) {
                System.out.println("enter thread2......");
                System.out.println("thread2 is sleep.....");
                //只用针对此对象notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
                Test.class.notify();
                //区别
                //如果把代码：Test.class.notify();给注释掉即Test.class调用了
                //wait()方法，但是没有调用notify()方法，则线程永远处于挂起状态。
                try {
                    //sleep()方法导致了程序暂停执行指定的时间，让出cpu给其他线程
                    //但是他的监控状态依然是保持者，当指定的时间到了又会自动恢复运行
                    //状态。在调用sleep()方法的过程中线程不会释放对象锁。
                    Thread.sleep(5000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("thread2 is going on....");
                System.out.println("thread2 is over!!!");
            }

        }
    }


    public static void main(String[] args) {
        new Thread(new Thread1()).start();
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        new Thread(new Thread2()).start();
    }
}
